scons简用

Program('prog' , ['prog1.c','prog2.c','prog3.c'])

可以使用Glob函数配置符合指定命名规则的文件,如: Program('program', Glob('*.c')) 可以匹配当前目录下所有c文件

编译库文件 静态库,将Program替换为Library或StaticLibrary即可,如: Library('foo', ['f1.c', 'f2.o', 'f3.c', 'f4.o']) 或 StaticLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) 动态库,将Program替换为SharedLibrary即可,如: SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])

如何指定链接参数 Program('prog.c', LIBS='foo', LIBPATH='.')

scons简介

首先编写SConstruct脚本:

1、Program:生成可执行文件

Program(‘hello.c’) Program(‘hello’,'hello.c’) Program(target = "hello" , source = "hello.c") Program(‘hello’, Split(‘hello.c file1.c file2.c’)) Program(Glob("*.c")) src = ["hello.c","foo.c"];Program(src)

2、Object:生成目标文件

3、Library:生成静态/动态库文件

Library(‘foo’, ['f1.c', 'f2.c', 'f3.c']) 编译library SharedLibrary(‘foo’, ['f1.c', 'f2.c', 'f3.c']) 编译 shared library StaticLibrary(‘bar’, ['f4.c', 'f5.c', 'f6.c']) 编译 static library
库的使用方法:

Program(‘xmltest’,['xmltest.c'],

LIBS=’xml2′, LIBPATH=['/usr/local/lib'], CPPPATH=['/usr/local/include/libxml2'])

4、SourceSignatures:判断源文件是否修改

SourceSignatures(‘MD5′) 根据内容是否改变,默认方式 SourceSignatures(‘timestamp’) 根据修改时间

5、TargetSignatures:判断目标文件是否改变

TargetSignatures(‘build’) 根据编译结果 TargetSignatures(‘content’) 根据文件内容,如果只是加了句注释,将不会被重新编译

6、Ignore:忽略依赖关系

Ignore(hello, ‘hello.h’) 忽略某个依赖关系

7、Depends:明确依赖关系

Depends(hello, ‘other_file’) 明确依赖关系

8、多目录:

源文件的目录结构如下: src: | SConstruct | test.cpp | mA(目录): | SConscript | func.cpp 其中test.cpp为主文件,中调用func.cpp中定义的函数
SConstruct内容如下:

subobj = SConscript(['mA/SConscript']) obj = subobj + Object(Glob("*.cpp")) Program("test",list(obj))

SConscript内容 :

obj = Object(Glob("*.cpp")) Return("obj")

上例中,在主目录中执行 scons就可以编译整个"工程"。 SConstruct编译主目录中的test.cpp,并通过SConscript编译mA目录下的源文件,并最终生成可执行文件, SConscript用于编译mA中的func.cpp并把生成的func.o传递给主目录的SConstruct。

9.env:环境变量

可以使用如下的SConstruct查看环境变量的内容:

env = Environment() dict = env.Dictionary() keys = dict.keys() keys.sort() for key in keys:

print "construction variable = ‘%s’, value = ‘%s’" % (key, dict[key])
环境变量的使用: env = Environment() #创建默认的环境变量,默认scons会按编译器的默认选项来进行编译 import os env = Environment(CC = ‘gcc’,CCFLAGS = ‘-O2′) #创建并设置环境 变量 env.Program(‘foo.c’)
环境变量的复制: env = Environment(CC = ‘gcc’) opt = env.Clone(CCFLAGS = ‘-O2′) dbg = env.Clone(CCFLAGS = ‘-g’)
环境变量的替换: env = Environment(CCFLAGS = ‘-DDEFINE1′) env.Replace(CCFLAGS = ‘-DDEFINE2′) env.Program(‘foo.c’)

执行scons进行编译

scons 编译 scons -c clean scons -Q 只显示编译信息,去除多余的打印信息 scons -Q –implicit-cache hello 保存依赖关系 –implicit-deps-changed 强制更新依赖关系 –implicit-deps-unchanged 强制使用原先的依赖关系,即使已经改变